﻿using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections;

/// <summary>
/// 缓存的父类
/// </summary>
public abstract class PCache
{
    public PCache()
    {
        
    }

    //全局对象
    static System.Web.HttpApplicationState _App = HttpContext.Current.Application; //当前页面的全局对象    

    //缓存数据源
    public object Cache_getData(object index)
    {	    
	    Hashtable dslist = new Hashtable();
	    //如果该键对象存在，则获取数组
        dslist = (Hashtable)_App[appname];
        if (dslist == null) { dslist = new Hashtable(); }
	    //如果该数据源存在，则直接输出        
	    if(dslist.ContainsKey(index))
	    { 
		    //[数据源]_缓存出
		    return dslist[index]; 
	    }
    	
	    //反之，往数据库里拉
	    object dbdata = GetDBdata(index);
	    //添加至缓存
	    dslist.Add(index, dbdata);

        _App.Lock();
	    _App[appname] = dslist;
        _App.UnLock();

	    //[数据源]_数据库出
	    return dbdata;
    }

    //删除 一个或多个缓存
    public void Cache_delData(ArrayList keys)
    {	    
	    Hashtable dslist = new Hashtable();
	    //如果该键对象存在，则获取数组
        dslist = (Hashtable)_App[appname];
        if (dslist == null) { return; }
    	
	    //循环删除编号对应的缓存
	    foreach(object v in keys)
	    {
            try{
                dslist.Remove(v); //删除缓存
            }catch{}
	    }
    	
        //更新全局
        _App.Lock();
        _App[appname] = dslist;
        _App.UnLock();
    }

    /// <summary>
    /// 清空缓存
    /// </summary>
    public static void AppClear()
    {
        _App.Lock();
        _App.Clear();
        _App.UnLock();
    }

    #region 抽象属性
    /// <summary>
    /// 获取全局对象里的缓存索引
    /// </summary>
    protected abstract string appname
    { get; }
    #endregion

    #region 抽象方法
    /// <summary>
    /// 从数据库里拉
    /// </summary>
    /// <param name="index">参数</param>    
    protected abstract object GetDBdata(object index);
    #endregion
}
